package cn.skyclass.net
{
	import cn.skyclass.utils.StringUtil;
	
	/**
	 * 处理和 url 参数相关的信息
	 */
	public class UrlParams
	{
		/**
		 * paramsStr : 参数字符串，默认是当前 url 的参数字符串。
		 * paramsStr example: a=1&b=2&c=leo
		 */
		public function UrlParams(paramsStr:String=null, ignoreCase:Boolean=true){
			this.params = (paramsStr == null) ? URLUtilEx.getQueryParams() : paramsStr;
			this.ignoreCase = ignoreCase;
			this.splitParams();
		}
		
		protected var params:String = "";
		protected var ignoreCase:Boolean = true;
		protected var keys:Array = new Array();
		protected var values:Array = new Array();
		
		
		/**
		 * 获取 String 类型的 url 参数值，如果指定的参数不存在则返回 defaultValue
		 */
		public function getStrValue(paramName:String, defaultValue:String=""):String{
			var i:int = this.searchKey(paramName);
			if(i >= 0){
				var value:String = values[i].toString();
				return value ? decodeURIComponent(value) : defaultValue;
			}else{
				return defaultValue;
			}
		}	
		
		/**
		 * 获取 boolean 类型的 url 参数值，如果指定的参数不存在则返回 defaultValue
		 */	
		public function getBoolValue(paramName:String, defaultValue:Boolean=false):Boolean{
			var i:int = this.searchKey(paramName);
			if(i >= 0){
				return StringUtil.getBoolValue(values[i].toString());
			}else{
				return defaultValue;
			}			
		}	
		
		/**
		 * 获取 int 类型的 url 参数值，如果指定的参数不存在则返回 defaultValue
		 */	
		public function getIntValue(paramName:String, defaultValue:int=0):int{
			var i:int = this.searchKey(paramName);
			if(i >= 0){
				return int(values[i].toString());
			}else{
				return defaultValue;
			}			
		}	
		
		
		/**
		 * 将全部的查询参数分解，然后分别放入键值对的数组中
		 */
		protected function splitParams():void{
			var pairs:Array = params.split("&");
			for each(var p:String in pairs){
				var ieq:int = p.indexOf("=");
				if(ieq > 0){
					keys.push(p.substring(0, ieq));
					values.push(p.substring(ieq + 1));
				}
			}			
		}		
		
		/**
		 * return index of key if key exist
		 * else return -1
		 */
		protected function searchKey(key:String):int{
			if(!key){ return -1; }
			
			for(var i:int=0; i<keys.length; i++){
				var k:String = keys[i].toString();
				var match:Boolean = ignoreCase ? 
					(k.toLowerCase() == key.toLowerCase()) : (k == key);
				if(match){
					return i;
				}				
			}
			return -1;			
		}	
	}
}